/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org

This file is part of Gephi.

Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

Gephi is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.visualization.options;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.prefs.BackingStoreException;
import org.gephi.ui.components.JColorButton;
import org.gephi.ui.utils.ColorUtils;
import org.gephi.ui.utils.PrefsUtils;
import org.gephi.visualization.VizController;
import org.gephi.visualization.apiimpl.VizConfig;
import org.gephi.visualization.config.GraphicalConfiguration;
import org.gephi.visualization.opengl.Lighting;
import org.gephi.visualization.opengl.Lighting.Light;
import org.openide.util.Exceptions;
import org.openide.util.NbPreferences;

final class OpenGLPanel extends javax.swing.JPanel {

    private final OpenGLOptionsPanelController controller;

    //Settings
    private int antiAliasing = 0;

    OpenGLPanel(OpenGLOptionsPanelController controller) {
        this.controller = controller;
        initComponents();

        antialisaingCombobox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                if (antialisaingCombobox.getSelectedIndex() > 0) {
                    antiAliasing = (int) Math.pow(2, antialisaingCombobox.getSelectedIndex());
                } else {
                    antiAliasing = 0;
                }
            }
        });

        ((JColorButton) ambientAmbiantColorButton).setIncludeOpacity(true);
        ((JColorButton) ambientDiffuseColorButton).setIncludeOpacity(true);
        ((JColorButton) ambientSpecularColorButton).setIncludeOpacity(true);
        ((JColorButton) light1AmbiantColorButton).setIncludeOpacity(true);
        ((JColorButton) light1DiffuseColorButton).setIncludeOpacity(true);
        ((JColorButton) light1SpecularColorButton).setIncludeOpacity(true);
        ((JColorButton) light2AmbiantColorButton).setIncludeOpacity(true);
        ((JColorButton) light2DiffuseColorButton).setIncludeOpacity(true);
        ((JColorButton) light2SpecularColorButton).setIncludeOpacity(true);
        ((JColorButton) light3AmbiantColorButton).setIncludeOpacity(true);
        ((JColorButton) light3DiffuseColorButton).setIncludeOpacity(true);
        ((JColorButton) light3SpecularColorButton).setIncludeOpacity(true);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jXTitledSeparator1 = new org.jdesktop.swingx.JXTitledSeparator();
        labelAntialiasing = new javax.swing.JLabel();
        antialisaingCombobox = new javax.swing.JComboBox();
        labelShow = new javax.swing.JLabel();
        fpsCheckbox = new javax.swing.JCheckBox();
        jXTitledSeparator3 = new org.jdesktop.swingx.JXTitledSeparator();
        labelAmbiant = new javax.swing.JLabel();
        ambientDiffuseColorButton = new JColorButton(Color.BLACK);
        ambientSpecularColorButton = new JColorButton(Color.BLACK);
        ambientAmbiantColorButton = new JColorButton(Color.BLACK);
        labelDirectional = new javax.swing.JLabel();
        light1AmbiantColorButton = new JColorButton(Color.BLACK);
        light1DiffuseColorButton = new JColorButton(Color.BLACK);
        light1SpecularColorButton = new JColorButton(Color.BLACK);
        light1Checkbox = new javax.swing.JCheckBox();
        light2Checkbox = new javax.swing.JCheckBox();
        light2AmbiantColorButton = new JColorButton(Color.BLACK);
        light2DiffuseColorButton = new JColorButton(Color.BLACK);
        light2SpecularColorButton = new JColorButton(Color.BLACK);
        light3Checkbox = new javax.swing.JCheckBox();
        light3AmbiantColorButton = new JColorButton(Color.BLACK);
        light3DiffuseColorButton = new JColorButton(Color.BLACK);
        light3SpecularColorButton = new JColorButton(Color.BLACK);
        light1XPosition = new javax.swing.JSpinner();
        jLabel1 = new javax.swing.JLabel();
        light1YPosition = new javax.swing.JSpinner();
        jLabel2 = new javax.swing.JLabel();
        light1ZPosition = new javax.swing.JSpinner();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        light2XPosition = new javax.swing.JSpinner();
        jLabel5 = new javax.swing.JLabel();
        light2YPosition = new javax.swing.JSpinner();
        jLabel6 = new javax.swing.JLabel();
        light2ZPosition = new javax.swing.JSpinner();
        jLabel7 = new javax.swing.JLabel();
        light3XPosition = new javax.swing.JSpinner();
        jLabel8 = new javax.swing.JLabel();
        light3YPosition = new javax.swing.JSpinner();
        jLabel9 = new javax.swing.JLabel();
        light3ZPosition = new javax.swing.JSpinner();
        resetButton = new javax.swing.JButton();
        jLabel10 = new javax.swing.JLabel();
        openglInfoPanel = new javax.swing.JPanel();
        openInfoText = new javax.swing.JTextArea();

        jXTitledSeparator1.setTitle(org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jXTitledSeparator1.title")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(labelAntialiasing, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.labelAntialiasing.text")); // NOI18N

        antialisaingCombobox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0x", "2x", "4x", "8x", "16x" }));

        org.openide.awt.Mnemonics.setLocalizedText(labelShow, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.labelShow.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(fpsCheckbox, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.fpsCheckbox.text")); // NOI18N
        fpsCheckbox.setMargin(new java.awt.Insets(2, 0, 2, 2));

        jXTitledSeparator3.setTitle(org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jXTitledSeparator3.title")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(labelAmbiant, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.labelAmbiant.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(ambientDiffuseColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.ambientDiffuseColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(ambientSpecularColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.ambientSpecularColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(ambientAmbiantColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.ambientAmbiantColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(labelDirectional, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.labelDirectional.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light1AmbiantColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light1AmbiantColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light1DiffuseColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light1DiffuseColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light1SpecularColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light1SpecularColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light1Checkbox, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light1Checkbox.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light2Checkbox, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light2Checkbox.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light2AmbiantColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light2AmbiantColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light2DiffuseColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light2DiffuseColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light2SpecularColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light2SpecularColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light3Checkbox, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light3Checkbox.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light3AmbiantColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light3AmbiantColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light3DiffuseColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light3DiffuseColorButton.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(light3SpecularColorButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.light3SpecularColorButton.text")); // NOI18N

        light1XPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel1.text")); // NOI18N

        light1YPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel2.text")); // NOI18N

        light1ZPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel3.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel4.text")); // NOI18N

        light2XPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel5.text")); // NOI18N

        light2YPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel6.text")); // NOI18N

        light2ZPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel7, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel7.text")); // NOI18N

        light3XPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel8, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel8.text")); // NOI18N

        light3YPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(jLabel9, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel9.text")); // NOI18N

        light3ZPosition.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), null, null, Float.valueOf(0.1f)));

        org.openide.awt.Mnemonics.setLocalizedText(resetButton, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.resetButton.text")); // NOI18N
        resetButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                resetButtonActionPerformed(evt);
            }
        });

        jLabel10.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(jLabel10, org.openide.util.NbBundle.getMessage(OpenGLPanel.class, "OpenGLPanel.jLabel10.text")); // NOI18N
        jLabel10.setForeground(new java.awt.Color(102, 102, 102));

        openglInfoPanel.setLayout(new java.awt.GridBagLayout());

        openInfoText.setColumns(5);
        openInfoText.setEditable(false);
        openInfoText.setFont(new java.awt.Font("Monospaced", 0, 11)); // NOI18N
        openInfoText.setRows(3);
        openInfoText.setText("Vendor\nModel\nVersion"); // NOI18N
        openInfoText.setOpaque(false);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        openglInfoPanel.add(openInfoText, gridBagConstraints);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jXTitledSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE)
                    .addComponent(resetButton)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(labelAmbiant)
                            .addComponent(labelDirectional))
                        .addGap(21, 21, 21)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(light2Checkbox)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light2AmbiantColorButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light2DiffuseColorButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light2SpecularColorButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel4)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light2XPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel5)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light2YPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel6)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light2ZPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(light3Checkbox)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light3AmbiantColorButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light3DiffuseColorButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light3SpecularColorButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel7)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light3XPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel8)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light3YPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel9)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light3ZPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(ambientAmbiantColorButton)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(ambientDiffuseColorButton)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(ambientSpecularColorButton))
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(light1Checkbox)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(light1AmbiantColorButton)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(light1DiffuseColorButton)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(light1SpecularColorButton)))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel1)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light1XPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light1YPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(light1ZPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jXTitledSeparator3, javax.swing.GroupLayout.DEFAULT_SIZE, 424, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(10, 10, 10)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(labelShow, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(labelAntialiasing))
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addGap(20, 20, 20)
                                        .addComponent(fpsCheckbox))
                                    .addGroup(layout.createSequentialGroup()
                                        .addGap(18, 18, 18)
                                        .addComponent(antialisaingCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(openglInfoPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabel10, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jXTitledSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(openglInfoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelAntialiasing)
                            .addComponent(antialisaingCombobox))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelShow, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE)
                            .addComponent(fpsCheckbox))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jXTitledSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel10))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelAmbiant)
                    .addComponent(ambientDiffuseColorButton)
                    .addComponent(ambientAmbiantColorButton)
                    .addComponent(ambientSpecularColorButton))
                .addGap(13, 13, 13)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(light1DiffuseColorButton)
                    .addComponent(light1AmbiantColorButton)
                    .addComponent(light1SpecularColorButton)
                    .addComponent(labelDirectional)
                    .addComponent(light1Checkbox)
                    .addComponent(light1XPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1)
                    .addComponent(light1YPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2)
                    .addComponent(light1ZPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(light2DiffuseColorButton)
                    .addComponent(light2AmbiantColorButton)
                    .addComponent(light2SpecularColorButton)
                    .addComponent(light2Checkbox)
                    .addComponent(light2XPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4)
                    .addComponent(light2YPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5)
                    .addComponent(light2ZPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(light3DiffuseColorButton)
                    .addComponent(light3AmbiantColorButton)
                    .addComponent(light3SpecularColorButton)
                    .addComponent(light3Checkbox)
                    .addComponent(light3XPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel7)
                    .addComponent(light3YPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8)
                    .addComponent(light3ZPosition, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 60, Short.MAX_VALUE)
                .addComponent(resetButton)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void resetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetButtonActionPerformed
        try {
            NbPreferences.forModule(Lighting.class).clear();
            NbPreferences.forModule(Lighting.class).remove(Lighting.AMBIANT_ENABLED);
            NbPreferences.forModule(Lighting.class).remove(Lighting.AMBIANT_AMBIANT);
            NbPreferences.forModule(Lighting.class).remove(Lighting.AMBIANT_SPECULAR);
            NbPreferences.forModule(Lighting.class).remove(Lighting.AMBIANT_DIFFUSE);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT1_ENABLED);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT1_AMBIANT);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT1_SPECULAR);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT1_DIFFUSE);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT1_POSITION);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT2_ENABLED);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT2_AMBIANT);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT2_SPECULAR);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT2_DIFFUSE);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT2_POSITION);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT3_ENABLED);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT3_AMBIANT);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT3_SPECULAR);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT3_DIFFUSE);
            NbPreferences.forModule(Lighting.class).remove(Lighting.LIGHT3_POSITION);
            NbPreferences.forModule(VizConfig.class).remove(VizConfig.ANTIALIASING);
            NbPreferences.forModule(VizConfig.class).remove(VizConfig.SHOW_FPS);
        } catch (BackingStoreException ex) {
            Exceptions.printStackTrace(ex);
        }
        load();
    }//GEN-LAST:event_resetButtonActionPerformed

    void load() {
        antiAliasing = NbPreferences.forModule(VizConfig.class).getInt(VizConfig.ANTIALIASING, VizConfig.DEFAULT_ANTIALIASING);
        antialisaingCombobox.setSelectedIndex(antiAliasing == 0 ? 0 : Math.round((float) (Math.log(antiAliasing) / Math.log(2))));
        fpsCheckbox.setSelected(NbPreferences.forModule(VizConfig.class).getBoolean(VizConfig.SHOW_FPS, VizConfig.DEFAULT_SHOW_FPS));

        //Lights
        Lighting lighting = new Lighting();
        Light ambiant = lighting.getLights().get(0);
        Light light1 = lighting.getLights().get(1);
        Light light2 = lighting.getLights().get(2);
        Light light3 = lighting.getLights().get(3);

        //Ambiant
        ((JColorButton) ambientAmbiantColorButton).setColor(ColorUtils.decode(ambiant.getAmbiant()));
        ((JColorButton) ambientDiffuseColorButton).setColor(ColorUtils.decode(ambiant.getDiffuse()));
        ((JColorButton) ambientSpecularColorButton).setColor(ColorUtils.decode(ambiant.getSpecular()));

        //Light1
        light1Checkbox.setSelected(light1.isEnabled());
        ((JColorButton) light1AmbiantColorButton).setColor(ColorUtils.decode(light1.getAmbiant()));
        ((JColorButton) light1DiffuseColorButton).setColor(ColorUtils.decode(light1.getDiffuse()));
        ((JColorButton) light1SpecularColorButton).setColor(ColorUtils.decode(light1.getSpecular()));
        light1XPosition.setValue(Float.valueOf(light1.getDirection()[0]));
        light1YPosition.setValue(Float.valueOf(light1.getDirection()[1]));
        light1ZPosition.setValue(Float.valueOf(light1.getDirection()[2]));

        //Light2
        light2Checkbox.setSelected(light2.isEnabled());
        ((JColorButton) light2AmbiantColorButton).setColor(ColorUtils.decode(light2.getAmbiant()));
        ((JColorButton) light2DiffuseColorButton).setColor(ColorUtils.decode(light2.getDiffuse()));
        ((JColorButton) light2SpecularColorButton).setColor(ColorUtils.decode(light2.getSpecular()));
        light2XPosition.setValue(Float.valueOf(light2.getDirection()[0]));
        light2YPosition.setValue(Float.valueOf(light2.getDirection()[1]));
        light2ZPosition.setValue(Float.valueOf(light2.getDirection()[2]));

        //Light3
        light3Checkbox.setSelected(light3.isEnabled());
        ((JColorButton) light3AmbiantColorButton).setColor(ColorUtils.decode(light3.getAmbiant()));
        ((JColorButton) light3DiffuseColorButton).setColor(ColorUtils.decode(light3.getDiffuse()));
        ((JColorButton) light3SpecularColorButton).setColor(ColorUtils.decode(light3.getSpecular()));
        light3XPosition.setValue(Float.valueOf(light3.getDirection()[0]));
        light3YPosition.setValue(Float.valueOf(light3.getDirection()[1]));
        light3ZPosition.setValue(Float.valueOf(light3.getDirection()[2]));

        //OpenGLInfo
        GraphicalConfiguration gc = VizController.getInstance().getDrawable().getGraphicalConfiguration();
        openInfoText.setText(gc.getVendor() + "\n" + gc.getRenderer() + "\nOpenGL " + gc.getVersionStr());
    }

    void store() {
        NbPreferences.forModule(VizConfig.class).putInt(VizConfig.ANTIALIASING, antiAliasing);
        NbPreferences.forModule(VizConfig.class).putBoolean(VizConfig.SHOW_FPS, fpsCheckbox.isSelected());

        //Ambiant
        NbPreferences.forModule(Lighting.class).put(Lighting.AMBIANT_AMBIANT, PrefsUtils.floatArrayToString(((JColorButton) ambientAmbiantColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.AMBIANT_DIFFUSE, PrefsUtils.floatArrayToString(((JColorButton) ambientDiffuseColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.AMBIANT_SPECULAR, PrefsUtils.floatArrayToString(((JColorButton) ambientSpecularColorButton).getColorArray()));

        //Light1
        NbPreferences.forModule(Lighting.class).putBoolean(Lighting.LIGHT1_ENABLED, light1Checkbox.isSelected());
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT1_AMBIANT, PrefsUtils.floatArrayToString(((JColorButton) light1AmbiantColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT1_DIFFUSE, PrefsUtils.floatArrayToString(((JColorButton) light1DiffuseColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT1_SPECULAR, PrefsUtils.floatArrayToString(((JColorButton) light1SpecularColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT1_POSITION, PrefsUtils.floatArrayToString(new float[]{(Float) light1XPosition.getValue(), (Float) light1YPosition.getValue(), (Float) light1ZPosition.getValue(), 0f}));

        //Light2
        NbPreferences.forModule(Lighting.class).putBoolean(Lighting.LIGHT2_ENABLED, light2Checkbox.isSelected());
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT2_AMBIANT, PrefsUtils.floatArrayToString(((JColorButton) light2AmbiantColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT2_DIFFUSE, PrefsUtils.floatArrayToString(((JColorButton) light2DiffuseColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT2_SPECULAR, PrefsUtils.floatArrayToString(((JColorButton) light2SpecularColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT2_POSITION, PrefsUtils.floatArrayToString(new float[]{(Float) light2XPosition.getValue(), (Float) light2YPosition.getValue(), (Float) light2ZPosition.getValue(), 0f}));

        //Light3
        NbPreferences.forModule(Lighting.class).putBoolean(Lighting.LIGHT3_ENABLED, light3Checkbox.isSelected());
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT3_AMBIANT, PrefsUtils.floatArrayToString(((JColorButton) light3AmbiantColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT3_DIFFUSE, PrefsUtils.floatArrayToString(((JColorButton) light3DiffuseColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT3_SPECULAR, PrefsUtils.floatArrayToString(((JColorButton) light3SpecularColorButton).getColorArray()));
        NbPreferences.forModule(Lighting.class).put(Lighting.LIGHT3_POSITION, PrefsUtils.floatArrayToString(new float[]{(Float) light3XPosition.getValue(), (Float) light3YPosition.getValue(), (Float) light3ZPosition.getValue(), 0f}));

        VizController.getInstance().getEngine().reinit();
    }

    boolean valid() {
        // TODO check whether form is consistent and complete
        return true;
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton ambientAmbiantColorButton;
    private javax.swing.JButton ambientDiffuseColorButton;
    private javax.swing.JButton ambientSpecularColorButton;
    private javax.swing.JComboBox antialisaingCombobox;
    private javax.swing.JCheckBox fpsCheckbox;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private org.jdesktop.swingx.JXTitledSeparator jXTitledSeparator1;
    private org.jdesktop.swingx.JXTitledSeparator jXTitledSeparator3;
    private javax.swing.JLabel labelAmbiant;
    private javax.swing.JLabel labelAntialiasing;
    private javax.swing.JLabel labelDirectional;
    private javax.swing.JLabel labelShow;
    private javax.swing.JButton light1AmbiantColorButton;
    private javax.swing.JCheckBox light1Checkbox;
    private javax.swing.JButton light1DiffuseColorButton;
    private javax.swing.JButton light1SpecularColorButton;
    private javax.swing.JSpinner light1XPosition;
    private javax.swing.JSpinner light1YPosition;
    private javax.swing.JSpinner light1ZPosition;
    private javax.swing.JButton light2AmbiantColorButton;
    private javax.swing.JCheckBox light2Checkbox;
    private javax.swing.JButton light2DiffuseColorButton;
    private javax.swing.JButton light2SpecularColorButton;
    private javax.swing.JSpinner light2XPosition;
    private javax.swing.JSpinner light2YPosition;
    private javax.swing.JSpinner light2ZPosition;
    private javax.swing.JButton light3AmbiantColorButton;
    private javax.swing.JCheckBox light3Checkbox;
    private javax.swing.JButton light3DiffuseColorButton;
    private javax.swing.JButton light3SpecularColorButton;
    private javax.swing.JSpinner light3XPosition;
    private javax.swing.JSpinner light3YPosition;
    private javax.swing.JSpinner light3ZPosition;
    private javax.swing.JTextArea openInfoText;
    private javax.swing.JPanel openglInfoPanel;
    private javax.swing.JButton resetButton;
    // End of variables declaration//GEN-END:variables
}
